﻿using System;
using System.Collections.Generic;
using System.Linq;
using Enum;
using RFMS;

namespace BU
{
    public class Uren
    {
        public DateTime Tijd { get; set; }
        public int WerknemerNaam { get; set; }

        private ModelRFMSContainer _container;
        public Uren()
        {
            _container = ModelRFMSContainer.GetInstance();
        }

        public void Toevoegen( DateTime tijd, int werknemerId, Status status)
        {
            switch (status)
            {
                case Status.Inchecken:
                    var uren = new RFMS.Uren();
                    uren.Inchecken = tijd;
                    uren.Status = 1;
                    uren.Werknemer = WerknemerIDKoppeling(werknemerId);
                    _container.UrenSet.AddObject(uren);    
                    _container.SaveChanges();
                    break;

                case Status.Uitchecken:
                    var index = LaatsteId(werknemerId);
                    var urenKoppeling = _container.UrenSet.FirstOrDefault(p => p.Id == index);
                    DateTime beginTijd = TotaalUrenBerekenen(werknemerId);

                    urenKoppeling.Uitchecken = tijd;
                    urenKoppeling.Status = 2;
                    DateTime totaal = new DateTime().Add(tijd - beginTijd);
                    string berekening = totaal.ToString("HH:mm:ss");

                    urenKoppeling.TotaalUren = DateTime.ParseExact(berekening,"HH:mm:ss",null);

                    _container.SaveChanges();
                    break;
                default:
                    break;
            }
        }

        private int LaatsteId(int werkNemerId)
        {
            var laatsteId = from c in _container.UrenSet
                             where c.Werknemer.WerknemerId == werkNemerId
                             select c;

            var lijst = new List<List<int>>();

            foreach (var id in laatsteId)
            {
                lijst.Add(new List<int> { id.Id });
            }

            return lijst.Last().Last();
        }

        private DateTime TotaalUrenBerekenen(int werkNemerId)
        {
            var totaalUren = from c in _container.UrenSet
                             where c.Werknemer.WerknemerId == werkNemerId
                              select c;

            var lijst = new List<List<DateTime>>();

            foreach (var uren in totaalUren)
            {
                lijst.Add(new List<DateTime> { Convert.ToDateTime(uren.Inchecken)});
            }

            return lijst.Last().Last();
        }

        public List<List<object>> UrenOverzicht()
        {
            var urenOverzicht = from c in _container.UrenSet
                                select c;

            var lijst = new List<List<object>>();

            foreach (var uren in urenOverzicht)
            {
                lijst.Add(new List<object> { uren.Werknemer.Naam, uren.Inchecken, 
                    uren.Uitchecken, uren.TotaalUren, uren.Status });
            }

            return lijst;
        }

        //

        public List<List<object>> UrenOverzicht(string werknemerNaam)
        {
            var urenOverzicht = from c in _container.UrenSet
                                where c.Werknemer.Naam == werknemerNaam
                                select c;

            var lijst = new List<List<object>>();

            foreach (var uren in urenOverzicht)
            {
                lijst.Add(new List<object> { uren.Werknemer.Naam, uren.Inchecken, 
                    uren.Uitchecken, uren.TotaalUren, uren.Status });
            }

            return lijst;
        }

        public List<List<object>> UrenOverzicht(DateTime datum)
        {
            string parameterDatum = datum.ToString("dd-MM-yyyy");


            var urenOverzicht = from c in _container.UrenSet
                                select c;

            var lijst = new List<List<object>>();

            foreach (var uren in urenOverzicht)
            {
                DateTime dateTime = Convert.ToDateTime(uren.Inchecken);
                string databaseDatum = dateTime.ToString("dd-MM-yyyy");

                if (parameterDatum == databaseDatum)
                {
                    lijst.Add(new List<object> { uren.Werknemer.Naam, uren.Inchecken, 
                        uren.Uitchecken, uren.TotaalUren, uren.Status });
                }
            }

            return lijst;
        }

        public List<List<object>> UrenOverzicht(string werknemerNaam, DateTime datum)
        {
            string parameterDatum = datum.ToString("dd-MM-yyyy");

            var urenOverzicht = from c in _container.UrenSet
                                where c.Werknemer.Naam == werknemerNaam
                                select c;

            var lijst = new List<List<object>>();

            foreach (var uren in urenOverzicht)
            {
                DateTime dateTime = Convert.ToDateTime(uren.Inchecken);
                string databaseDatum = dateTime.ToString("dd-MM-yyyy");

                if (parameterDatum == databaseDatum)
                {
                    lijst.Add(new List<object>
                                  {uren.Werknemer.Naam, uren.Inchecken, 
                                      uren.Uitchecken, uren.TotaalUren, uren.Status});
                }
            }

            return lijst;
        }

        private RFMS.Werknemer WerknemerIDKoppeling(int werknemerId)
        {
            RFMS.Werknemer werk = new RFMS.Werknemer();

            var test = from t in _container.WerknemerSet
                       where t.WerknemerId == werknemerId
                       select t;
            foreach (var text in test)
            {
                werk = text;
            }
            return werk;
        }
    }
}
